【MySQL】ビューの基本操作 - 仮想テーブルの作成・一覧・詳細・変更・削除

【MySQL】ビューの基本操作 - 仮想テーブルの作成・一覧・詳細・変更・削除

MySQLのビューの基本操作について解説します。

検証環境

ビュー

ビューは“仮想テーブル”です。

SELECT文のクエリ内容で構成され、テーブルのように扱えます。

作成(CREATE VIEW

ビューの作成はCREATE VIEW文を使用します。

基本構文

CREATE VIEW ビュー名 (カラム名1, カラム名2 ...) AS SELECT文

ビューは名前はビュー名、カラムはカラム名1, カラム名2 ...によって構成されます。

カラムは前から順番にSELECT文で取得したカラムにマッチします。

サンプル

mysql> DESC items;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int         | NO   | PRI | NULL    | auto_increment |
| name  | varchar(20) | YES  |     | NULL    |                |
| price | int         | YES  |     | NULL    |                |
| stock | int         | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.02 sec)

___ih_hl_start
mysql> CREATE VIEW fruits( id, name, unit_price )
    -> AS SELECT id, name, price FROM items;
___ih_hl_end
Query OK, 0 rows affected (0.02 sec)

12〜13行目がCREATE VIEW文です。

ビューの名前をfruitsとして、idnameunit_priceの3カラムから構成されるビューを作成しています。

また、ビュー名の後の丸括弧(())を省略した場合、SELECT文のカラム名をそのまま使用します。

___ih_hl_start
mysql> CREATE VIEW same_items 
    -> AS SELECT id, name, price FROM items;
___ih_hl_end
Query OK, 0 rows affected (0.00 sec)

一覧表示(SHOW TABLE STATUS

ビューはテーブルと同様にSHOW TABLES文によって表示できます。

mysql> SHOW TABLES;
+----------------+
| Tables_in_mydb |
+----------------+
| fruits         |
| items          |
| same_items     |
+----------------+
3 rows in set (0.00 sec)

ただし、SHOW TABLES文ではテーブルとビューが混同して表示されるため、ビューのみの一覧を表示するにはSHOW TABLE STATUS文を使用します。

基本構文

SHOW TABLE STATUS WHERE Comment = 'View';

この構文はそのまま使用できます。

サンプル

___ih_hl_start
mysql> SHOW TABLE STATUS WHERE Comment = 'View';
___ih_hl_end
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
| Name       | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
| fruits     | NULL   |    NULL | NULL       | NULL |           NULL |        NULL |            NULL |         NULL |      NULL |           NULL | 2024-05-12 20:21:02 | NULL        | NULL       | NULL      |     NULL | NULL           | VIEW    |
| same_items | NULL   |    NULL | NULL       | NULL |           NULL |        NULL |            NULL |         NULL |      NULL |           NULL | 2024-05-12 20:21:53 | NULL        | NULL       | NULL      |     NULL | NULL           | VIEW    |
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
2 rows in set (0.00 sec)

情報表示

ビューの情報や作成時クエリを表示できます。

情報(DESC

情報(ビュー構造)の表示はDESC文を使用します。

基本構文

DESC ビュー名

テーブルのDESC文と同様です。

サンプル

___ih_hl_start
mysql> DESC fruits;
___ih_hl_end
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| id         | int         | NO   |     | 0       |       |
| name       | varchar(20) | YES  |     | NULL    |       |
| unit_price | int         | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

基本的な見方はテーブルと同様です。

作成時クエリ(SHOW CREATE VIEW

作成時クエリの表示はSHOW CREATE VIEW文を使います。

基本構文

SHOW CREATE VIEW ビュー名

サンプル

___ih_hl_start
mysql> SHOW CREATE VIEW fruits;
___ih_hl_end
+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| View   | Create View                                                                                                                                                                                                         | character_set_client | collation_connection |
+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| fruits | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `fruits` (`id`,`name`,`unit_price`) AS select `items`.`id` AS `id`,`items`.`name` AS `name`,`items`.`price` AS `price` from `items` | utf8mb4              | utf8mb4_0900_ai_ci   |
+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
1 row in set (0.00 sec)

SHOW CREATE TABLE文でも同様の表示が可能です。

___ih_hl_start
mysql> SHOW CREATE TABLE fruits;
___ih_hl_end
+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| View   | Create View                                                                                                                                                                                                         | character_set_client | collation_connection |
+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| fruits | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `fruits` (`id`,`name`,`unit_price`) AS select `items`.`id` AS `id`,`items`.`name` AS `name`,`items`.`price` AS `price` from `items` | utf8mb4              | utf8mb4_0900_ai_ci   |
+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
1 row in set (0.00 sec)

データ取得(SELECT

ビューのデータ取得はテーブルと同様にSELECT文を使用します。

基本構文

SELECT カラム FROM ビュー名

テーブルのSELECT文と同様です。

サンプル

___ih_hl_start
mysql> SELECT * FROM fruits;
___ih_hl_end
+----+-----------+------------+
| id | name      | unit_price |
+----+-----------+------------+
|  1 | Apple     |        200 |
|  2 | Orange    |        150 |
|  3 | Pineapple |       1100 |
|  4 | Grapes    |       3500 |
|  5 | Melon     |       3500 |
+----+-----------+------------+
5 rows in set (0.01 sec)

ビューは定義時のSELECT文によって構成されるため、テーブルのデータ変更等の影響を受けます。

mysql> INSERT INTO items ( name, price, stock ) VALUE ( 'Lemon', 80, 30 );
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM fruits;
+----+-----------+------------+
| id | name      | unit_price |
+----+-----------+------------+
|  1 | Apple     |        200 |
|  2 | Orange    |        150 |
|  3 | Pineapple |       1100 |
|  4 | Grapes    |       3500 |
|  5 | Melon     |       3500 |
|  6 | Lemon     |         80 |
+----+-----------+------------+
6 rows in set (0.00 sec)

変更(ALTER VIEW

ビューの変更はALTER VIEW文を使用します。

基本構文

ALTER VIEW ビュー名 ( カラム名1, カラム名2 ... ) AS SELECT文

サンプル

mysql> DESC fruits;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| id         | int         | NO   |     | 0       |       |
| name       | varchar(20) | YES  |     | NULL    |       |
| unit_price | int         | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

___ih_hl_start
mysql> ALTER VIEW fruits ( id, name )
    -> AS SELECT id, name  FROM items;
___ih_hl_end
Query OK, 0 rows affected (0.01 sec)

mysql> DESC fruits;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | NO   |     | 0       |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

11〜12行目がALTER VIEW文です。

fruitsビューのカラムを変更しており、その後のDESC文からunit_priceカラムが減ったことが分かります。

削除(DROP VIEW

ビューの削除はDROP VIEW文を使用します。

基本構文

DROP VIEW ビュー名

サンプル

mysql> SHOW TABLE STATUS WHERE Comment = 'View';
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
| Name       | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
| fruits     | NULL   |    NULL | NULL       | NULL |           NULL |        NULL |            NULL |         NULL |      NULL |           NULL | 2024-05-12 20:21:02 | NULL        | NULL       | NULL      |     NULL | NULL           | VIEW    |
| same_items | NULL   |    NULL | NULL       | NULL |           NULL |        NULL |            NULL |         NULL |      NULL |           NULL | 2024-05-12 20:21:53 | NULL        | NULL       | NULL      |     NULL | NULL           | VIEW    |
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
2 rows in set (0.01 sec)

___ih_hl_start
mysql> DROP VIEW same_items;
___ih_hl_end
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW TABLE STATUS WHERE Comment = 'View';
+--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
| Name   | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
| fruits | NULL   |    NULL | NULL       | NULL |           NULL |        NULL |            NULL |         NULL |      NULL |           NULL | 2024-05-12 20:21:02 | NULL        | NULL       | NULL      |     NULL | NULL           | VIEW    |
+--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
1 row in set (0.00 sec)

mysql> SHOW TABLES;
+----------------+
| Tables_in_mydb |
+----------------+
| fruits         |
| items          |
+----------------+
2 rows in set (0.00 sec)

10行目がDROP VIEW文です。

same_itemsビューを削除しており、その後のビュー・テーブルの一覧表示にないことから、正常に削除できたことが分かります。